<!DOCTYPE html>
<html lang="en"><head>
    <title>CZH-DEV BLOG</title>
    <meta content="text/html;charset=utf-8" http-equiv="Content-Type">
    <meta content="utf-8" http-equiv="encoding">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="format-detection" content="telephone=no" />
    <meta name="theme-color" content="#000084" />
    <link rel="icon" href="https://czh-dev.gitee.io/czh-blog.gitee.io//favicon.ico">
    <link rel="canonical" href="https://czh-dev.gitee.io/czh-blog.gitee.io/">
    
    
</head>
<body>
<nav class="navbar navbar-inverse navbar-fixed-top">
    <div class="navbar-inner">
        <div class="container">
            <button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"></button>
            <a class="brand" href="https://czh-dev.gitee.io/czh-blog.gitee.io/">CZH-DEV BLOG</a>
            <div class="nav-collapse collapse">
                <ul class="nav">
                    
                    
                        
                            <li>
                                <a href="/czh-blog.gitee.io/about/">
                                    
                                    <span>About</span>
                                </a>
                            </li>
                        
                    
                        
                            <li>
                                <a href="/czh-blog.gitee.io/post/">
                                    
                                    <span>All posts</span>
                                </a>
                            </li>
                        
                    
                        
                            <li>
                                <a href="/czh-blog.gitee.io/ebook/">
                                    
                                    <span>Resource</span>
                                </a>
                            </li>
                        
                    
                </ul>
            </div>
        </div>
    </div>
</nav><div id="content" class="container">
<div style="display: flex;">
  <div class="row-fluid navmargin">
    <div class="page-header">
      <h1>Linux基本操作 - Fri, Feb 10, 2023</h1>
    </div>
    <p class="lead"></p>
    <h1 id="linux系统操作">Linux系统操作</h1>
<h2 id="常见linux命令的基本使用">常见Linux命令的基本使用</h2>
<table>
<thead>
<tr>
<th>序号</th>
<th>命令</th>
<th>对应英文</th>
<th>作用</th>
</tr>
</thead>
<tbody>
<tr>
<td>01</td>
<td>ls</td>
<td>list</td>
<td>查看当前文件夹下的内容</td>
</tr>
<tr>
<td>02</td>
<td>pwd</td>
<td>print wrod directory</td>
<td>查看当前所在文件夹</td>
</tr>
<tr>
<td>03</td>
<td>cd [目录名]</td>
<td>change directory</td>
<td>切换文件夹</td>
</tr>
<tr>
<td>04</td>
<td>touch [文件名]</td>
<td>touch</td>
<td>如果文件不存在,新建文件</td>
</tr>
<tr>
<td>05</td>
<td>mkdir [文件名]</td>
<td>make directory</td>
<td>创建目录</td>
</tr>
<tr>
<td>06</td>
<td>rm [文件名]</td>
<td>remove</td>
<td>删除指定的文件</td>
</tr>
<tr>
<td>07</td>
<td>clear</td>
<td>clear</td>
<td>清屏</td>
</tr>
</tbody>
</table>
<blockquote>
<p>小技巧</p>
<ul>
<li><code>clrl + shift + =</code> <strong>放大</strong>终端窗口的字体显示</li>
<li><code>ctrl + -</code> <strong>缩小</strong>终端窗口的字体显示</li>
</ul>
</blockquote>
<h2 id="查看目录内容">查看目录内容</h2>
<h3 id="终端实用技巧">终端实用技巧</h3>
<h4 id="自动补全">自动补全</h4>
<ul>
<li>在输出<code>文件</code>/<code>目录</code>/<code>命令</code>的前几个字母后,按下<code>Tab</code>键
<ul>
<li>如果输出的没有歧义,系统会自动补全</li>
<li>如果存在其他<code>文件</code>/<code>目录</code>/<code>命令</code>,再按下<code>Tab</code>键,系统会提示可能存在的命令</li>
</ul>
</li>
</ul>
<h4 id="曾经使用过的命令">曾经使用过的命令</h4>
<ul>
<li>按<code>上</code>/<code>下</code>光标键可以使用在曾经使用过的命令之间来回切换</li>
<li>如果想要退出选择,并且不想执行当前选中的命令,可以按<code>Ctrl + C</code></li>
</ul>
<h3 id="ls命令说明">ls命令说明</h3>
<ul>
<li><code>ls</code>是英文单词list的简写,其功能为列出目录的内容,是用户最常用的命令之一,类似于<strong>Dos</strong>下的<code>dir</code>命令</li>
</ul>
<h4 id="linux下文件和目录的特点">Linux下文件和目录的特点</h4>
<ul>
<li>Linux<code>文件</code>或者<code>目录</code>名称最长可以有<code>256</code>个字符</li>
<li>以<code>.</code>开头的文件为隐藏文件,需要用<code>-a</code>参数才能显示</li>
<li><code>.</code>代表当前目录</li>
<li><code>..</code>代表上一级目录</li>
</ul>
<h4 id="ls常用选项">ls常用选项</h4>
<table>
<thead>
<tr>
<th>参数</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td>-a</td>
<td>显示指定目录下所有子目录和文件,包括隐藏文件</td>
</tr>
<tr>
<td>-l</td>
<td>以列表方式显示文件的详细信息</td>
</tr>
<tr>
<td>-h</td>
<td>配合-l以人性化的方式显示文件大小</td>
</tr>
</tbody>
</table>
<h4 id="ls通配符的使用">ls通配符的使用</h4>
<table>
<thead>
<tr>
<th>通配符</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td>*</td>
<td>代表任意个数个字符</td>
</tr>
<tr>
<td>?</td>
<td>代表任意一个字符,至少1个</td>
</tr>
<tr>
<td>[]</td>
<td>表示可以匹配字符组中的任意一个</td>
</tr>
<tr>
<td>[abc]</td>
<td>匹配a,b,c中的任意一个</td>
</tr>
<tr>
<td>[a-f]</td>
<td>匹配从a到f范围内的任意一个字符</td>
</tr>
</tbody>
</table>
<h3 id="切换目录">切换目录</h3>
<h4 id="cd">cd</h4>
<ul>
<li><code>cd</code>是英文单词change directory的简写,其功能为更改当前的工作目录,也是用户最常用的命令之一</li>
</ul>
<blockquote>
<p>注意:Linux所有的<strong>目录</strong>和<strong>文件名</strong>都是大小写敏感的</p>
</blockquote>
<table>
<thead>
<tr>
<th>命令</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td>cd</td>
<td>切换当前用户的主目录(/home/用户目录)</td>
</tr>
<tr>
<td>cd ~</td>
<td>切换当前用户的主目录(/home/用户目录)</td>
</tr>
<tr>
<td>cd .</td>
<td>保持当前目录不变</td>
</tr>
<tr>
<td>cd ..</td>
<td>切换到上级目录</td>
</tr>
<tr>
<td>cd -</td>
<td>可以在最近两次工作目录之间来回切换</td>
</tr>
</tbody>
</table>
<h4 id="相对路径和绝对路径">相对路径和绝对路径</h4>
<ul>
<li><strong>相对路径</strong>在输出路径时,最前面不是 / 或者 ~ ,表示相对<strong>当前目录</strong>所在的目录位置</li>
<li><strong>绝对路径</strong>在输出路径时,最前面的是 / 或者 ~ ,表示从<strong>根目录/家目录</strong>开始的具体目录位置</li>
</ul>
<h3 id="创建和删除操作">创建和删除操作</h3>
<h4 id="touch">touch</h4>
<ul>
<li>创建文件或者修改文件时间
<ul>
<li>如果文件<strong>不存在</strong>,可以创建一个空白文件</li>
<li>如果文件<strong>存在</strong>.可以修改文件的末次数修改时间</li>
</ul>
</li>
</ul>
<h4 id="mkdir">mkdir</h4>
<ul>
<li>创建一个新的目录</li>
</ul>
<table>
<thead>
<tr>
<th>选项</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td>-p</td>
<td>可以递归创建目录</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>新建目录的名称</strong>不能与v当前目录中<strong>已有的目录和文件</strong>同名</p>
</blockquote>
<h4 id="rm">rm</h4>
<ul>
<li>删除文件或目录</li>
</ul>
<blockquote>
<p>使用<code>rm</code>命令要小心,因为文件删除后不能恢复</p>
</blockquote>
<table>
<thead>
<tr>
<th>参数</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td>-f</td>
<td>强制删除,忽略不存在的文件,无需提示</td>
</tr>
<tr>
<td>-r</td>
<td>递归地删除目录下的内容,<strong>删除文件夹</strong>时必须加此参数</td>
</tr>
</tbody>
</table>
<h3 id="拷贝和移动文件">拷贝和移动文件</h3>
<table>
<thead>
<tr>
<th>序号</th>
<th>命令</th>
<th>对应英文</th>
<th>作用</th>
</tr>
</thead>
<tbody>
<tr>
<td>01</td>
<td>tree [目录名]</td>
<td>tree</td>
<td>以树状图列出文件目录结构</td>
</tr>
<tr>
<td>02</td>
<td>cp 源文件 目标文件</td>
<td>copy</td>
<td>复制文件或目录</td>
</tr>
<tr>
<td>03</td>
<td>mv 源文件 目标文件</td>
<td>move</td>
<td>移动文件或者目录/文件或者目录重命名</td>
</tr>
</tbody>
</table>
<h4 id="tree">tree</h4>
<ul>
<li><code>tree</code>命令可以以树状图列出文件目录的结构</li>
</ul>
<table>
<thead>
<tr>
<th>选项</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td>-d</td>
<td>只显示目录</td>
</tr>
</tbody>
</table>
<h4 id="cp">cp</h4>
<ul>
<li><code>cp</code>命令的功能是将给出的<strong>文件</strong>或<strong>目录</strong>复制到另一个<strong>文件</strong>或<strong>目录</strong>中,相当于<strong>DOS</strong>下的<code>copy</code>命令</li>
</ul>
<table>
<thead>
<tr>
<th>选项</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td>-i</td>
<td>覆盖文件前提示</td>
</tr>
<tr>
<td>-f</td>
<td>若给出的源文件是目录文件,则cp                                                                            将递归复制该目录下的所有子目录的文件,目标文件必须为一个目录名</td>
</tr>
</tbody>
</table>
<h4 id="mv">mv</h4>
<ul>
<li><code>mv</code>命令可以用来<strong>移动文件</strong>或<strong>目录</strong>,也可以给<strong>文件或目录重命名</strong></li>
</ul>
<table>
<thead>
<tr>
<th>选项</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td>-i</td>
<td>覆盖文件前提示</td>
</tr>
</tbody>
</table>
<h3 id="查看文件内容">查看文件内容</h3>
<table>
<thead>
<tr>
<th>序号</th>
<th>命令</th>
<th>对应英文</th>
<th>作用</th>
</tr>
</thead>
<tbody>
<tr>
<td>01</td>
<td>cat 文件名</td>
<td>concatenate</td>
<td>查看文件内容,创建文件,文件合并,追加文件内容等功能</td>
</tr>
<tr>
<td>02</td>
<td>more 文件名</td>
<td>more</td>
<td>分屏显示文件内容</td>
</tr>
<tr>
<td>03</td>
<td>grep 搜索文本文件名</td>
<td>grep</td>
<td>搜索文本文件内容</td>
</tr>
</tbody>
</table>
<h4 id="cat">cat</h4>
<ul>
<li><code>cat</code>命令可以用来<strong>查看文件内容,创建文件,文件合并,追加文件内容</strong>等功能</li>
<li><code>cat</code>会一次显示所有的内容,适合<strong>查看内容较少</strong>的文本文件</li>
</ul>
<table>
<thead>
<tr>
<th>选项</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td>-b</td>
<td>对非空输出行编号</td>
</tr>
<tr>
<td>-n</td>
<td>对输出行的虽有行编号</td>
</tr>
</tbody>
</table>
<h4 id="more">more</h4>
<ul>
<li><code>more</code>命令可以用于分屏显示文件内容,每次只显示一页内容</li>
<li>适合于<strong>查看内容较多</strong>的文本文件</li>
</ul>
<table>
<thead>
<tr>
<th>操作键</th>
<th>功能</th>
</tr>
</thead>
<tbody>
<tr>
<td>空格键</td>
<td>显示手册页的下一屏</td>
</tr>
<tr>
<td>Enter键</td>
<td>一次滚动手册页的一行</td>
</tr>
<tr>
<td>b</td>
<td>回滚一屏</td>
</tr>
<tr>
<td>f</td>
<td>前滚一屏</td>
</tr>
<tr>
<td>q</td>
<td>退出</td>
</tr>
<tr>
<td>/word</td>
<td>搜索<strong>word</strong>字符串</td>
</tr>
</tbody>
</table>
<h4 id="grep">grep</h4>
<ul>
<li>Linux系统中<code>grep</code>命令是一种强大的文本搜索工具v</li>
<li><code>grep</code>允许对文本文件进行<strong>模式</strong>查找,所谓模式查找,又被成为正则表达式</li>
</ul>
<table>
<thead>
<tr>
<th>选项</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td>-n</td>
<td>显示匹配行及行号</td>
</tr>
<tr>
<td>-v</td>
<td>显示不包括匹配文本的所有行(相当有v取反)</td>
</tr>
<tr>
<td>-i</td>
<td>忽略大小写</td>
</tr>
</tbody>
</table>
<ul>
<li>常用两种模式查找</li>
</ul>
<table>
<thead>
<tr>
<th>参数</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td>^a</td>
<td>行首,搜寻以<strong>a</strong>开头的行</td>
</tr>
<tr>
<td>ke$</td>
<td>行尾,搜寻以<strong>ke</strong>结尾的行</td>
</tr>
</tbody>
</table>
<h3 id="其他">其他</h3>
<h4 id="echo-文字内容">echo 文字内容</h4>
<ul>
<li><code>echo</code>会在终端中显示参数指定的文字,通常会和<strong>重定向</strong>联合使用</li>
</ul>
<h4 id="重定向--和-">重定向 &gt; 和 &raquo;</h4>
<ul>
<li>Linux允许将命令执行结果<strong>重定向</strong>到一个<strong>文件</strong></li>
<li>将本应显示在<strong>终端上的内容 输出 / 追加</strong>到<strong>指定文件中</strong></li>
</ul>
<p>其中</p>
<ul>
<li><code>&gt;</code>表示输出,会覆盖文件原有的内容</li>
<li><code>&gt;&gt;</code>表示追加,会将内容追加到已有的文件末尾</li>
</ul>
<h4 id="管道">管道</h4>
<ul>
<li>Linux允许将<strong>一个命令的输出</strong>可以<strong>通过管道</strong>作为<strong>另一个命令的输入</strong></li>
<li>可以理解现实生活中的管子,管子一头塞东西进去,另一头取出来,这里<code>|</code>的左右分为两端,左端塞东西(写),右端取东西(读)</li>
</ul>
<p>常用的管道命令</p>
<ul>
<li><code>more</code>:分屏显示内容</li>
<li><code>grep</code>:在命令执行结果的基础上查询指定的文本</li>
</ul>
<h2 id="远程管理常用命令">远程管理常用命令</h2>
<h3 id="目标">目标</h3>
<ul>
<li>
<p>关机/重启</p>
<p><code>shutdown</code></p>
</li>
<li>
<p>查看或配置网卡信息</p>
<p><code>ifconfig</code></p>
<p><code>ping</code></p>
</li>
<li>
<p>远程登录和复制文件夹</p>
<p><code>ssh</code></p>
<p><code>scp</code></p>
</li>
</ul>
<h3 id="关机重启">关机/重启</h3>
<table>
<thead>
<tr>
<th>序号</th>
<th>命令</th>
<th>对应英文</th>
<th>作用</th>
</tr>
</thead>
<tbody>
<tr>
<td>01</td>
<td>shutdown 选项 时间</td>
<td>shutdown</td>
<td>关机/重新启动</td>
</tr>
</tbody>
</table>
<h4 id="shutdown">shutdown</h4>
<ul>
<li><code>shutdown</code>命令可以<strong>安全 关闭</strong>或<strong>重新启动系统</strong></li>
</ul>
<table>
<thead>
<tr>
<th>选项</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td>-r</td>
<td>重新启动</td>
</tr>
</tbody>
</table>
<blockquote>
<p>提示:</p>
<ul>
<li><strong>不指定选项和参数</strong>,默认表示<strong>1分钟</strong>之后<strong>关闭电脑</strong></li>
<li>远程维护服务器时,最好不要关闭系统,而应该重新启动系统</li>
</ul>
</blockquote>
<ul>
<li>常用命令实例</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#75715e"># 重新启动操作系统,其中 now 表示现在</span>
</span></span><span style="display:flex;"><span>$ shutdown -r now
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 立即关机,其中 now 表示现在</span>
</span></span><span style="display:flex;"><span>$ shutdown now
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 系统在今天的 20:25 会关机</span>
</span></span><span style="display:flex;"><span>$ shutdown 20:25
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 系统再过十分钟后自动关机</span>
</span></span><span style="display:flex;"><span>$ shutdown +10
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 取消之前指定的电脑关机计划</span>
</span></span><span style="display:flex;"><span>$ shutdown -c
</span></span></code></pre></div><h3 id="查看或配置网卡信息">查看或配置网卡信息</h3>
<table>
<thead>
<tr>
<th>序号</th>
<th>命令</th>
<th>对应英文</th>
<th>作用</th>
</tr>
</thead>
<tbody>
<tr>
<td>01</td>
<td>ifconfig</td>
<td>configure a network interface</td>
<td>查看/配置当前网卡配置信息</td>
</tr>
<tr>
<td>02</td>
<td>ping ip地址</td>
<td>ping</td>
<td>检测目标ip地址的连接是否正常</td>
</tr>
</tbody>
</table>
<h4 id="网卡和ip地址">网卡和IP地址</h4>
<h5 id="网卡">网卡</h5>
<ul>
<li>网卡是一个专门负责网络通讯的硬件设备</li>
<li>IP地址是设置在网卡上的地址信息</li>
</ul>
<blockquote>
<p>我们可以把<strong>电脑</strong>比作<strong>电话</strong>,<strong>网卡</strong>相当与<strong>SIM卡</strong>,<strong>IP地址</strong>相当于<strong>电话号码</strong></p>
</blockquote>
<h5 id="ip地址">IP地址</h5>
<ul>
<li>每台联网的电脑上都有IP地址,是保证电脑之间正常通讯的重要设置</li>
</ul>
<blockquote>
<p>注意:每台电脑的IP地址不能相同,否则会出现IP地址冲突,并且没有办法正常通讯</p>
</blockquote>
<h4 id="ifconfig">ifconfig</h4>
<ul>
<li><code>ifconfig</code>可以<strong>查看/配置</strong>计算机当前的网卡<strong>配置信息</strong></li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#75715e"># 查看网卡配置信息</span>
</span></span><span style="display:flex;"><span>$ ifconfig 
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 查看网卡对应的IP地址</span>
</span></span><span style="display:flex;"><span>$ ifconfig | grep inet
</span></span></code></pre></div><blockquote>
<p>提示:一台计算机中可能会有一个一个<strong>物理网卡</strong>和<strong>多个虚拟网卡</strong>,在Linux物理网卡的名字通常以<code>ensXX</code>表示</p>
</blockquote>
<ul>
<li>
<p><code>127.0.0.1</code>被称为<strong>本地回环/回环地址</strong>,一般会用来测试本机网卡是否正常</p>
</li>
<li>
<p>虚拟机修改mac地址</p>
<p>==编辑虚拟机设置==&ndash;==网络适配器==&ndash;==高级==&ndash;mac地址旁边的==生成==</p>
</li>
<li>
<p>虚拟机修改ip地址</p>
</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ vi /etc/sysconfig/network-scripts/ifcfg-ens32
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>TYPE<span style="color:#f92672">=</span>Ethernet
</span></span><span style="display:flex;"><span>BOOTPROTO<span style="color:#f92672">=</span>static
</span></span><span style="display:flex;"><span>DEVICE<span style="color:#f92672">=</span>ens32
</span></span><span style="display:flex;"><span>ONBOOT<span style="color:#f92672">=</span>yes
</span></span><span style="display:flex;"><span>IPADDR<span style="color:#f92672">=</span>192.168.33.10 <span style="color:#75715e">#修改这里 </span>
</span></span><span style="display:flex;"><span>NETMASK<span style="color:#f92672">=</span>255.255.255.0
</span></span><span style="display:flex;"><span>GATEWAY<span style="color:#f92672">=</span>192.168.33.2
</span></span><span style="display:flex;"><span>DNS1<span style="color:#f92672">=</span>8.8.8.8
</span></span><span style="display:flex;"><span>DNS2<span style="color:#f92672">=</span>114.114.114.114
</span></span></code></pre></div><h4 id="ping">ping</h4>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#75715e"># 检测到目标主机是否正常连接</span>
</span></span><span style="display:flex;"><span>$ ping IP地址
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 检测本地网卡正常工作</span>
</span></span><span style="display:flex;"><span>$ ping 127.0.0.1
</span></span></code></pre></div><ul>
<li><code>ping</code>一般用来检测当前计算机到目标计算机之间网络<strong>是否通畅,数值越大,速度越慢</strong></li>
</ul>
<blockquote>
<ul>
<li><code>ping</code>的工作原理与潜水艇的声纳相似,<code>ping</code>这个命令就是取自<strong>声纳的声音</strong></li>
<li>网络管理员之间也常将<code>ping</code>用作动词 &ndash; <strong>ping一下计算机X,看他是否开着</strong></li>
</ul>
</blockquote>
<p>原理:网络上的机器都有<strong>唯一的IP地址</strong>,当我们给<strong>目标IP地址</strong>发送一个数据包,对方就要返回一个数据包,根据返回的数据包以及时间,我们可以确定目标主机的存在</p>
<blockquote>
<p>提示:在Linux系统中,想要终止终端程序的执行,绝大多数都可以使用<code>CTRL + C</code></p>
</blockquote>
<h3 id="远程登录和复制文件">远程登录和复制文件</h3>
<table>
<thead>
<tr>
<th>序号</th>
<th>命令</th>
<th>对应英文</th>
<th>作用</th>
</tr>
</thead>
<tbody>
<tr>
<td>01</td>
<td>ssh用户名@ip</td>
<td>secure shell</td>
<td>关机/重新启动</td>
</tr>
<tr>
<td>02</td>
<td>scp用户名@ip:文件名或路径  用户名@ip:文件名或路径</td>
<td>secure copy</td>
<td>远程复制文件</td>
</tr>
</tbody>
</table>
<h4 id="ssh基础重点">ssh基础(重点)</h4>
<p>在Linux中SSH是<strong>非常重要</strong>的工具,通过<strong>SSH客户端</strong>我们可以连接到运行了<strong>SSH服务器</strong>的远程机器上</p>
<ul>
<li>数据传输是==加密==的,可以==防止信息泄漏==</li>
<li>数据传输是==压缩==的,可以==提高传输速度==</li>
<li><strong>SSH客户端</strong>是一种使用<code>Secure Shell (SSH)</code> 协议连接到远程计算机的软件程序</li>
<li><code>SSH</code>是目前较可靠,<strong>专为远程登录会话和其他网络服务</strong>提供安全性的协议
<ul>
<li>利用<code>SSH协议</code>可以有效<strong>防止远程管理过程中的信息泄漏</strong></li>
<li>通过<code>SSH协议</code>可以对所有传输的数据进行加密,也能够防止DNS欺骗和IP欺骗</li>
</ul>
</li>
<li><code>SSH</code>的另一优点是传输数据可以是经过压缩的,所以可以加快传输的速度</li>
</ul>
<h4 id="域名和端口号">域名和端口号</h4>
<h5 id="域名">域名</h5>
<ul>
<li>由一串<strong>用点分隔</strong>的名字组成,例如:<code>www.baidu.com</code></li>
<li>是<strong>IP地址</strong>的别名,方便用户记忆</li>
</ul>
<h5 id="端口号">端口号</h5>
<ul>
<li><strong>IP地址</strong>: 通过<strong>IP地址</strong>找到网络撒谎那个的<strong>计算机</strong></li>
<li><strong>端口号</strong>: 通过<strong>端口号</strong>可以找到<strong>计算机上运行的应用程序</strong>
<ul>
<li><strong>SSH服务器</strong>的默认端口号是<code>22</code>,如果是默认的端口号,在连接时可以省略</li>
</ul>
</li>
<li>常见的服务端口号列表:</li>
</ul>
<table>
<thead>
<tr>
<th>序号</th>
<th>服务</th>
<th>端口号</th>
</tr>
</thead>
<tbody>
<tr>
<td>01</td>
<td>SSH服务器</td>
<td>22</td>
</tr>
<tr>
<td>02</td>
<td>Web服务器</td>
<td>80</td>
</tr>
<tr>
<td>03</td>
<td>HTTPS</td>
<td>445</td>
</tr>
<tr>
<td>04</td>
<td>FTP服务器</td>
<td>21</td>
</tr>
</tbody>
</table>
<h4 id="ssh客户端的简单使用">SSH客户端的简单使用</h4>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>ssh <span style="color:#f92672">[</span>-p port<span style="color:#f92672">]</span> user@remote
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># ssh czh@czh-HP-242-G1-Notebook-PC</span>
</span></span></code></pre></div><ul>
<li><code>user</code>是在远程机器上的用户名,如果不指定的话默认为当前用户</li>
<li><code>remote</code>是远程机器的地址,可以是<strong>IP/域名</strong>,或者是<strong>别名</strong></li>
<li><code>port</code>是<strong>SSH Server监听的端口</strong>,如果不指定,就为默认值<code>22</code></li>
</ul>
<blockquote>
<p>提示:</p>
<ul>
<li>使用<code>exit</code>退出当前用户的登录</li>
</ul>
<p>注意:</p>
<ul>
<li><code>ssh</code>这个终端命令只能在<code>Linux</code>或者<code>UNIX</code>系统下使用</li>
<li>如果在<code>windows</code>系统中,可以安装<code>PuTTY</code>或者<code>XShell</code>客户端软件即可</li>
</ul>
<p>提示:</p>
<ul>
<li>在工作中,SSH服务器的端口号很有可能<strong>不是22</strong>,如果遇到这种情况需要使用<code>-p</code>选项,指定正确的端口号,否则无法正常连接到服务器</li>
</ul>
</blockquote>
<h4 id="windows下ssh客户端安装">Windows下SSH客户端安装</h4>
<ul>
<li><code>Putty</code><!-- raw HTML omitted --><a href="http://www.Chiark.greenend.org/-sgtatham/putty/latest.html">http://www.Chiark.greenend.org/-sgtatham/putty/latest.html</a><!-- raw HTML omitted --></li>
<li><code>XShell</code><!-- raw HTML omitted --><a href="http://xshellcn.com">http://xshellcn.com</a><!-- raw HTML omitted --></li>
</ul>
<h3 id="scp掌握">scp(掌握)</h3>
<ul>
<li>scp就是<code>secure copy</code>,是一个在Linux系统下进行<strong>远程拷贝文件</strong>的命令</li>
<li>它的<strong>地址格式与ssh基本相同,需要注意的是</strong>,在指定端口时用的是大写<code>-P</code>而不是小写</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#75715e"># 把当前目录下的 01.py文件 复制到 远程 家目录下的 Desktop/01.py</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 注意 &#39;:&#39; 后面路径如果不是绝对路径,则以用户的家目录作为参照路径</span>
</span></span><span style="display:flex;"><span>$ scp -P prot 01.py user@remote:Desktop/01.py
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 把远程 家目录下的Desktop/01.py文件 复制到本地当前目录下的01.py</span>
</span></span><span style="display:flex;"><span>$ scp -P port user@remote:Desktop/01.py 01.py
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 加上 -r 选项可以传送文件夹</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 把当前目录下的demo 文件夹 复制到 远程 家目录下的 Desktop</span>
</span></span><span style="display:flex;"><span>$ scp -r demo user@remote:Desktop
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 把远程 家目录下的Desktop 复制到 当前目录下的 demo 文件夹</span>
</span></span><span style="display:flex;"><span>$ scp -r user@remote:Desktop demo
</span></span></code></pre></div><table>
<thead>
<tr>
<th>选项</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td>-r</td>
<td>若给出的源文件是目录文件,则scp将递归复制该目录下的所有子目录和文件,目标文件必须为一个目录</td>
</tr>
<tr>
<td>-P</td>
<td>若远程SSH服务器的端口不是22,需要使用大写字母 -P选项指定端口</td>
</tr>
</tbody>
</table>
<h3 id="ubuntu安装-nodejs-16">Ubuntu安装 nodejs 16</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ sudo apt update
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$ sudo apt install apt-transport-https curl ca-certificates software-properties-common
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$ curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$ sudo apt-get install -y nodejs
</span></span></code></pre></div><h3 id="ubuntu安装pnpm">Ubuntu安装pnpm</h3>
<p>安装完成nodejs16后</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#75715e"># 安装pnpm</span>
</span></span><span style="display:flex;"><span>$ sudo npm install pnpm -g
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 查看源</span>
</span></span><span style="display:flex;"><span>$ pnpm config get registry
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 切换淘宝源</span>
</span></span><span style="display:flex;"><span>$ pnpm config set registry https://registry.npmmirror.com/
</span></span></code></pre></div><h3 id="ubuntu查看ip地址">Ubuntu查看ip地址</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>$ ifconfig
</span></span><span style="display:flex;"><span>$ ip addr
</span></span><span style="display:flex;"><span>$ ip addr show
</span></span><span style="display:flex;"><span>$ hostname <span style="color:#75715e">#czh-HP-242-G1-Notebook-PC</span>
</span></span></code></pre></div><h2 id="git">GIT</h2>
<h3 id="从远端拉取代码">从远端拉取代码</h3>
<ul>
<li>在本地新建一个文件夹</li>
<li>打开文件夹，从该文件夹进入git命令行页面
<ul>
<li>==右键==&ndash;&gt;==Git bash here==</li>
</ul>
</li>
<li>进入命令行后，先初始化基础信息设置</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ git config --global user.name <span style="color:#e6db74">&#34;用户名&#34;</span> 
</span></span><span style="display:flex;"><span>	name: GitHub：czhqwer	Gitee：爱吃炸排骨
</span></span><span style="display:flex;"><span>$ git config --global user.email <span style="color:#e6db74">&#34;邮箱&#34;</span>
</span></span><span style="display:flex;"><span>	email:<span style="color:#e6db74">&#34;c262222zh@163.com&#34;</span>
</span></span></code></pre></div><ul>
<li>查看之前的设置</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ git config  --list
</span></span></code></pre></div><ul>
<li>初始化</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ git init
</span></span></code></pre></div><ul>
<li>本地文件夹域远程仓库建立连接</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ git remote add origin 仓库地址
</span></span></code></pre></div><ul>
<li>
<ul>
<li>
<p>如果填错仓库 删除后重新添加即可</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>git remote rm origin 
</span></span></code></pre></div></li>
</ul>
</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>//将远程仓库的文件拷贝到本地文件夹
</span></span><span style="display:flex;"><span>$ git clone https://gitee.com/i-like-fried-ribs/qwer1234.git
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$ git branch -al
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$ git pull origin master
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>//拉取新的代码
</span></span><span style="display:flex;"><span>$ git pull
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Username <span style="color:#66d9ef">for</span> <span style="color:#e6db74">&#39;https://gitee.com&#39;</span>: xxxxxxxx
</span></span><span style="display:flex;"><span>Password <span style="color:#66d9ef">for</span> <span style="color:#e6db74">&#39;https://c262222zh@163.com@gitee.com&#39;</span>:  xxxxxxx
</span></span></code></pre></div><p><img src="C:%5CUsers%5Cczh%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20220505091049118.png" alt="image-20220505091049118"></p>
<h3 id="更新代码">更新代码</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ git add . （修改哪个，提交哪个，写路径）
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$ git commit -m <span style="color:#e6db74">&#34;注释&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$ git push
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Username <span style="color:#66d9ef">for</span> <span style="color:#e6db74">&#39;https://gitee.com&#39;</span>: c262222zh@163.com
</span></span><span style="display:flex;"><span>Password <span style="color:#66d9ef">for</span> <span style="color:#e6db74">&#39;https://c262222zh@163.com@gitee.com&#39;</span>:
</span></span></code></pre></div><ul>
<li>修改分支</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ git checkout czh/dev2
</span></span></code></pre></div><ul>
<li>查看状态</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ git status
</span></span></code></pre></div><ul>
<li>强制提交</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ git push origin +czh/dev2
</span></span></code></pre></div><ul>
<li>有一些文件没有修改但是提示修改了</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ git checkout src/assets/
</span></span><span style="display:flex;"><span><span style="color:#75715e">#从索引区更新了 5 个路径</span>
</span></span></code></pre></div><ul>
<li>
<blockquote>
<p>error: 您对下列文件的本地修改将被检出操作覆盖：
package.json
请在切换分支前提交或贮藏您的修改。
正在终止</p>
</blockquote>
</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ git stash <span style="color:#75715e">#保存工作目录和索引状态</span>
</span></span></code></pre></div><h2 id="遇到的问题">遇到的问题</h2>
<h3 id="xxx-is-not-in-the-sudoers-filethis-incident-will-be-reported">xxx is not in the sudoers file.This incident will be reported</h3>
<p>Linux中普通用户用sudo执行命令时报”xxx is not in the sudoers file.This incident will be reported”错误，解决方法就是在/etc/sudoers文件里给该用户添加权限。</p>
<p><img src="https://czh-pic.oss-cn-guangzhou.aliyuncs.com/202302111203162.png" alt="image-20221109005829226"></p>
<p>解决方法：</p>
<p>1.切换到root用户下 
方法为直接在命令行输入：<em>su</em>，然后输入密码（即你的登录密码，且密码默认不可见）。</p>
<p>2./etc/sudoers文件默认是只读的，对root来说也是，因此需先添加sudoers文件的写权限，命令是: 
即执行操作：<code>chmod u+w /etc/sudoers</code></p>
<p>3.编辑sudoers文件 
即执行：<code>vi /etc/sudoers </code>
找到这行 root ALL = (ALL) ALL,在他下面添加xxx ALL=(ALL) ALL (这里的xxx是你的用户名)</p>
<p><img src="https://czh-pic.oss-cn-guangzhou.aliyuncs.com/202302111203265.png" alt="image-20221109005927238"></p>
<p>4.撤销sudoers文件写权限，命令：
<code>chmod u-w /etc/sudoers</code>
5.切换用户
<code>su yakong</code></p>
<h3 id="安装tomcat碰到的问题">安装Tomcat碰到的问题</h3>
<h4 id="neither-the-java_home-nor-the-jre_home-environment-variable-is-defined">Neither the JAVA_HOME nor the JRE_HOME environment variable is defined</h4>
<p><strong>At least one of these environment variable is needed to run this program</strong></p>
<p>（JAVA_HOME和JRE_HOME环境变量都没有定义，运行此程序至少需要其中一个环境变量）</p>
<p>解决方法：在tomcat中配置Java、jre环境变量</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#f92672">[</span>root@VM-4-7-centos bin<span style="color:#f92672">]</span>$ vim /usr/local/tomcat9/bin/setclasspath.sh
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span> 在第一个行不是注释的上面加
</span></span><span style="display:flex;"><span>    export JAVA_HOME<span style="color:#f92672">=</span>/usr/local/jdk1.8
</span></span><span style="display:flex;"><span>    export JRE_HOME<span style="color:#f92672">=</span>/usr/local/jdk1.8/jre
</span></span><span style="display:flex;"><span> 保存退出
</span></span></code></pre></div><p>重新启动tomcat即可</p>
<h4 id="启动tomcat浏览器访问8080端口没有反应超时">启动Tomcat浏览器访问8080端口没有反应（超时）</h4>
<p>原因可能是linux的防火墙没打开8080端口</p>
<p>解决方法：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#f92672">[</span>root@VM-4-7-centos conf<span style="color:#f92672">]</span>$ firewall-cmd --state <span style="color:#75715e">#查看防火墙状态 Running是表示运行中</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>root@VM-4-7-centos conf<span style="color:#f92672">]</span>$ firewall-cmd --zone<span style="color:#f92672">=</span>public --add-port<span style="color:#f92672">=</span>8080/tcp --permanent <span style="color:#75715e">#打开8080端口 success表示成功</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>root@VM-4-7-centos conf<span style="color:#f92672">]</span>$ firewall-cmd --reload <span style="color:#75715e">#重启防火墙 success表示成功</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>root@VM-4-7-centos conf<span style="color:#f92672">]</span>$ firewall-cmd --zone<span style="color:#f92672">=</span>public --query-port<span style="color:#f92672">=</span>8080/tcp <span style="color:#75715e">#查看8080端口是否已开放 y</span>
</span></span></code></pre></div>
    <h4><a href="https://czh-dev.gitee.io/czh-blog.gitee.io/">Back to Home</a></h4>
  </div>

  <div class="span3 bs-docs-sidebar" style="position:fixed;right: 40px;top: 50px;">
    <h1>catalogue</h1>
    <ul class="nav nav-list bs-docs-sidenav">
      <div class="toc-div">
        <nav id="TableOfContents">
  <ul>
    <li><a href="#常见linux命令的基本使用">常见Linux命令的基本使用</a></li>
    <li><a href="#查看目录内容">查看目录内容</a>
      <ul>
        <li><a href="#终端实用技巧">终端实用技巧</a></li>
        <li><a href="#ls命令说明">ls命令说明</a></li>
        <li><a href="#切换目录">切换目录</a></li>
        <li><a href="#创建和删除操作">创建和删除操作</a></li>
        <li><a href="#拷贝和移动文件">拷贝和移动文件</a></li>
        <li><a href="#查看文件内容">查看文件内容</a></li>
        <li><a href="#其他">其他</a></li>
      </ul>
    </li>
    <li><a href="#远程管理常用命令">远程管理常用命令</a>
      <ul>
        <li><a href="#目标">目标</a></li>
        <li><a href="#关机重启">关机/重启</a></li>
        <li><a href="#查看或配置网卡信息">查看或配置网卡信息</a></li>
        <li><a href="#远程登录和复制文件">远程登录和复制文件</a></li>
        <li><a href="#scp掌握">scp(掌握)</a></li>
        <li><a href="#ubuntu安装-nodejs-16">Ubuntu安装 nodejs 16</a></li>
        <li><a href="#ubuntu安装pnpm">Ubuntu安装pnpm</a></li>
        <li><a href="#ubuntu查看ip地址">Ubuntu查看ip地址</a></li>
      </ul>
    </li>
    <li><a href="#git">GIT</a>
      <ul>
        <li><a href="#从远端拉取代码">从远端拉取代码</a></li>
        <li><a href="#更新代码">更新代码</a></li>
      </ul>
    </li>
    <li><a href="#遇到的问题">遇到的问题</a>
      <ul>
        <li><a href="#xxx-is-not-in-the-sudoers-filethis-incident-will-be-reported">xxx is not in the sudoers file.This incident will be reported</a></li>
        <li><a href="#安装tomcat碰到的问题">安装Tomcat碰到的问题</a></li>
      </ul>
    </li>
  </ul>
</nav>
      </div>
    </ul>
  </div>

</div>
<script src="https://cdn.jsdelivr.net/npm/gumshoejs@5.1.2/dist/gumshoe.min.js"></script>
<script>
  var spy = new Gumshoe('#TableOfContents a', {
    nested: true,
    nestedClass: 'active'
  });
</script>
<style>
   
  #TableOfContents li,
  #TableOfContents ul {
    list-style-type: none;
  }

  #TableOfContents ul {
    padding-left: 0px;
  }

  #TableOfContents li>a {
    display: block;
    padding: 4px 20px;
    font-size: 95%;
    color: #000000;
  }

  #TableOfContents li>a:hover,
  #TableOfContents li>a:focus {
    padding-left: 19px;
    color: #3A6bA5;
    text-decoration: none;
    background-color: transparent;
    border-left: 1px solid #3A6bA5;
  }

  #TableOfContents li.active>a,
  #TableOfContents li.active>a:hover,
  #TableOfContents li.active>a:focus {
    padding-left: 18px;
    font-weight: bold;
    color: #3A6bA5;
    background-color: transparent;
    border-left: 2px solid #3A6bA5;
  }

   
  #TableOfContents li>ul {
    padding-bottom: 10px;
  }

  #TableOfContents li li>a {
    padding-top: 1px;
    padding-bottom: 1px;
    padding-left: 30px;
    font-size: 14px;
    font-weight: normal;
  }

  #TableOfContents li li>a:hover,
  #TableOfContents li li>a:focus {
    padding-left: 29px;
  }

  #TableOfContents li li.active>a,
  #TableOfContents li li.active>a:hover,
  #TableOfContents li li.active>a:focus {
    padding-left: 28px;
    font-weight: 500;
  }

  #TableOfContents .nav-link.active+ul {
    display: block;
  }

  #TableOfContents li>ul {
    display: none;
  }

  #TableOfContents li.active>ul {
    display: inherit;
  }

  .toc-div {
    position: -webkit-sticky;
     
    position: sticky;
     
    top: 20px;
  }
</style>


        </div><footer class="container">
    <hr class="soften">
    <p>
    <a href="https://space.bilibili.com/1799809923">Love eating fried pork ribs</a> | 

&copy; 
<a href="http://jmf-portfolio.netlify.com" target="_blank">
    JM Fergeau
</a>
<span id="thisyear">2023</span>

    | My site


        | Built on <a href="//gohugo.io" target="_blank">Hugo</a>

</p>
    <p class="text-center">
        <a href="https://facebook.com">Facebook</a> 
        <a href="https://twitter.com">Twitter</a> 
        <a href="https://linkedin.com">Linkedin</a> 
        <a href="https://github.com">GitHub</a> 
        <a href="https://gitlab.com">GitLab</a>
    </p>
</footer>

</body><link rel="stylesheet" href="/czh-blog.gitee.io/css/bootstrap.css">
<link rel="stylesheet" href="/czh-blog.gitee.io/css/bootstrap-responsive.css">
<link rel="stylesheet" href="/czh-blog.gitee.io/css/style.css">

<script src="/czh-blog.gitee.io/js/jquery.js"></script>
<script src="/czh-blog.gitee.io/js/bootstrap-386.js"></script>
<script src="/czh-blog.gitee.io/js/bootstrap-transition.js"></script>
<script src="/czh-blog.gitee.io/js/bootstrap-alert.js"></script>
<script src="/czh-blog.gitee.io/js/bootstrap-modal.js"></script>
<script src="/czh-blog.gitee.io/js/bootstrap-dropdown.js"></script>
<script src="/czh-blog.gitee.io/js/bootstrap-scrollspy.js"></script>
<script src="/czh-blog.gitee.io/js/bootstrap-tab.js"></script>
<script src="/czh-blog.gitee.io/js/bootstrap-tooltip.js"></script>
<script src="/czh-blog.gitee.io/js/bootstrap-popover.js"></script>
<script src="/czh-blog.gitee.io/js/bootstrap-button.js"></script>
<script src="/czh-blog.gitee.io/js/bootstrap-collapse.js"></script>
<script src="/czh-blog.gitee.io/js/bootstrap-carousel.js"></script>
<script src="/czh-blog.gitee.io/js/bootstrap-typeahead.js"></script>
<script src="/czh-blog.gitee.io/js/bootstrap-affix.js"></script>
<script>
    _386 = { 
        fastLoad: false ,
        onePass: false , 
        speedFactor: 1 
    };

    
    function ThisYear() {
        document.getElementById('thisyear').innerHTML = new Date().getFullYear();
    };
</script>
</html>
